ãœãããŠã§ã¢éçºã«ãããåå®å šãªãªããžã§ã¯ãçæã®ããã®ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ãæ¢æ±ããŸããã³ãŒãã®ä¿å®æ§åäžããšã©ãŒåæžãå šäœçãªèšèšæ¹åã®æ¹æ³ãåŠã³ãŸããå®è·µçãªäŸãå«ãŸããŠããŸãã
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ïŒãªããžã§ã¯ãçæã®åå®å šæ§ãå®çŸãã
ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ããªããžã§ã¯ãã®å ·è±¡ã¯ã©ã¹ãæå®ããã«ãªããžã§ã¯ããäœæããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããçæã«é¢ãããã¶ã€ã³ãã¿ãŒã³ã§ããããã«ãããã¯ã©ã€ã¢ã³ãã³ãŒãããªããžã§ã¯ãçæããã»ã¹ããåé¢ããã³ãŒããããæè»ã§ä¿å®æ§ã®é«ããã®ã«ããããšãã§ããŸããããããåŸæ¥ã®ãã¡ã¯ããªãŒãã¿ãŒã³ã¯åå®å šæ§ãäžè¶³ããŠããå Žåããããå®è¡æãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãããžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ããžã§ããªã¯ã¹ã掻çšããŠåå®å šãªãªããžã§ã¯ãçæãä¿èšŒããããšã§ããã®å¶éã«å¯ŸåŠããŸãã
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ãšã¯ïŒ
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ãæšæºçãªãã¡ã¯ããªãŒãã¿ãŒã³ãæ¡åŒµãããã®ã§ããžã§ããªã¯ã¹ãå©çšããŠã³ã³ãã€ã«æã«åå®å šæ§ã匷å¶ããŸããããã«ããããã¡ã¯ããªãŒã«ãã£ãŠäœæããããªããžã§ã¯ããæåŸ ãããåã«é©åããããšãä¿èšŒããå®è¡æã®äºæãã¬ãšã©ãŒãé²ããŸããããã¯ãC#ãJavaãTypeScriptãªã©ã®ãžã§ããªã¯ã¹ããµããŒãããèšèªã§ç¹ã«åœ¹ç«ã¡ãŸãã
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã䜿çšããå©ç¹
- åå®å šæ§: äœæããããªããžã§ã¯ããæ£ããåã§ããããšãä¿èšŒããå®è¡æãšã©ãŒã®ãªã¹ã¯ã軜æžããŸãã
- ã³ãŒãã®ä¿å®æ§: ãªããžã§ã¯ãçæãã¯ã©ã€ã¢ã³ãã³ãŒãããåé¢ããã¯ã©ã€ã¢ã³ãã«åœ±é¿ãäžããããšãªããã¡ã¯ããªãŒãç°¡åã«å€æŽãŸãã¯æ¡åŒµã§ããããã«ããŸãã
- æè»æ§: åãã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯æœè±¡ã¯ã©ã¹ã®ç°ãªãå®è£ éãç°¡åã«åãæ¿ããããšãã§ããŸãã
- å®åã³ãŒãã®åæž: ãªããžã§ã¯ãçæããžãã¯ããã¡ã¯ããªãŒå ã«ã«ãã»ã«åããããšã§ãç°¡çŽ åã§ããŸãã
- ãã¹ãå®¹ææ§ã®åäž: ãã¡ã¯ããªãŒãç°¡åã«ã¢ãã¯ãŸãã¯ã¹ã¿ãåã§ããããã«ããããšã§ãåäœãã¹ããä¿é²ããŸãã
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã®å®è£
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã®å®è£ ã§ã¯ãéåžžãäœæããããªããžã§ã¯ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯æœè±¡ã¯ã©ã¹ãå®çŸ©ããæ¬¡ã«ãžã§ããªã¯ã¹ã䜿çšããŠåå®å šæ§ãä¿èšŒãããã¡ã¯ããªãŒã¯ã©ã¹ãäœæããŸãã以äžã«C#ãJavaãTypeScriptã§ã®äŸã瀺ããŸãã
C#ã§ã®äŸ
æ§æèšå®ã«åºã¥ããŠç°ãªãçš®é¡ã®ãã¬ãŒãäœæããå¿ èŠãããã·ããªãªãèããŸãã
// Define an interface for loggers
public interface ILogger
{
void Log(string message);
}
// Concrete implementations of loggers
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Console: {message}");
}
}
public class FileLogger : ILogger
{
private readonly string _filePath;
public FileLogger(string filePath)
{
_filePath = filePath;
}
public void Log(string message)
{
File.AppendAllText(_filePath, $"{DateTime.Now}: {message}\n");
}
}
// Generic factory interface
public interface ILoggerFactory
{
T CreateLogger<T>() where T : ILogger;
}
// Concrete factory implementation
public class LoggerFactory : ILoggerFactory
{
public T CreateLogger<T>() where T : ILogger
{
if (typeof(T) == typeof(ConsoleLogger))
{
return (T)(ILogger)new ConsoleLogger();
}
else if (typeof(T) == typeof(FileLogger))
{
// Ideally, read the file path from configuration
return (T)(ILogger)new FileLogger("log.txt");
}
else
{
throw new ArgumentException($"Unsupported logger type: {typeof(T).Name}");");
}
}
}
// Usage
public class MyApplication
{
private readonly ILogger _logger;
public MyApplication(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<ConsoleLogger>();
}
public void DoSomething()
{
_logger.Log("Doing something...");
}
}
ãã®C#ã®äŸã§ã¯ãILoggerFactoryã€ã³ã¿ãŒãã§ãŒã¹ãšLoggerFactoryã¯ã©ã¹ããžã§ããªã¯ã¹ã䜿çšããŠãCreateLoggerã¡ãœãããæ£ããåã®ãªããžã§ã¯ããè¿ãããšãä¿èšŒããŠããŸããwhere T : ILoggerå¶çŽã¯ãILoggerã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããã¯ã©ã¹ã®ã¿ããã¡ã¯ããªãŒã«ãã£ãŠäœæãããããšãä¿èšŒããŸãã
Javaã§ã®äŸ
以äžã«ãç°ãªãçš®é¡ã®å³åœ¢ãäœæããããã®ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã®Javaå®è£ ã瀺ããŸãã
// Define an interface for shapes
interface Shape {
void draw();
}
// Concrete implementations of shapes
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("Drawing a square");
}
}
// Generic factory interface
interface ShapeFactory {
<T extends Shape> T createShape(Class<T> shapeType);
}
// Concrete factory implementation
class DefaultShapeFactory implements ShapeFactory {
@Override
public <T extends Shape> T createShape(Class<T> shapeType) {
try {
return shapeType.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new IllegalArgumentException("Cannot create shape of type: " + shapeType.getName(), e);
}
}
}
// Usage
public class Main {
public static void main(String[] args) {
ShapeFactory factory = new DefaultShapeFactory();
Circle circle = factory.createShape(Circle.class);
circle.draw();
Square square = factory.createShape(Square.class);
square.draw();
}
}
ãã®Javaã®äŸã§ã¯ãShapeFactoryã€ã³ã¿ãŒãã§ãŒã¹ãšDefaultShapeFactoryã¯ã©ã¹ããžã§ããªã¯ã¹ã䜿çšããŠãã¯ã©ã€ã¢ã³ããäœæããShapeã®æ£ç¢ºãªåãæå®ã§ããããã«ããŠããŸããClass<T>ãšãªãã¬ã¯ã·ã§ã³ã䜿çšããããšã§ããã¡ã¯ããªãŒèªäœãåã¯ã©ã¹ã«ã€ããŠæç€ºçã«ç¥ãå¿
èŠãªããç°ãªãå³åœ¢åãã€ã³ã¹ã¿ã³ã¹åããæè»ãªæ¹æ³ãæäŸããŸãã
TypeScriptã§ã®äŸ
以äžã«ãç°ãªãçš®é¡ã®éç¥ãäœæããããã®TypeScriptå®è£ ã瀺ããŸãã
// Define an interface for notifications
interface INotification {
send(message: string): void;
}
// Concrete implementations of notifications
class EmailNotification implements INotification {
private readonly emailAddress: string;
constructor(emailAddress: string) {
this.emailAddress = emailAddress;
}
send(message: string): void {
console.log(`Sending email to ${this.emailAddress}: ${message}`);
}
}
class SMSNotification implements INotification {
private readonly phoneNumber: string;
constructor(phoneNumber: string) {
this.phoneNumber = phoneNumber;
}
send(message: string): void {
console.log(`Sending SMS to ${this.phoneNumber}: ${message}`);
}
}
// Generic factory interface
interface INotificationFactory {
createNotification<T extends INotification>(): T;
}
// Concrete factory implementation
class NotificationFactory implements INotificationFactory {
createNotification<T extends INotification>(): T {
if (typeof T === typeof EmailNotification) {
return new EmailNotification("test@example.com") as T;
} else if (typeof T === typeof SMSNotification) {
return new SMSNotification("+15551234567") as T;
} else {
throw new Error(`Unsupported notification type: ${typeof T}`);
}
}
}
// Usage
const factory = new NotificationFactory();
const emailNotification = factory.createNotification<EmailNotification>();
emailNotification.send("Hello from email!");
const smsNotification = factory.createNotification<SMSNotification>();
smsNotification.send("Hello from SMS!");
ãã®TypeScriptã®äŸã§ã¯ãINotificationFactoryã€ã³ã¿ãŒãã§ãŒã¹ãšNotificationFactoryã¯ã©ã¹ããžã§ããªã¯ã¹ã䜿çšããŠãã¯ã©ã€ã¢ã³ããäœæããINotificationã®æ£ç¢ºãªåãæå®ã§ããããã«ããŠããŸãããã¡ã¯ããªãŒã¯ãINotificationã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãäœæããããšã§åå®å
šæ§ãä¿èšŒããŸããæ¯èŒã«typeof Tã䜿çšããã®ã¯ãäžè¬çãªTypeScriptã®ãã¿ãŒã³ã§ãã
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã䜿çšããã¿ã€ãã³ã°
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ã次ã®ãããªã·ããªãªã§ç¹ã«åœ¹ç«ã¡ãŸãã
- å®è¡ææ¡ä»¶ã«åºã¥ããŠç°ãªãçš®é¡ã®ãªããžã§ã¯ããäœæããå¿ èŠãããå Žåã
- ãªããžã§ã¯ãçæãã¯ã©ã€ã¢ã³ãã³ãŒãããåé¢ãããå Žåã
- å®è¡æãšã©ãŒãé²ãããã«ã³ã³ãã€ã«æã®åå®å šæ§ãå¿ èŠãªå Žåã
- åãã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯æœè±¡ã¯ã©ã¹ã®ç°ãªãå®è£ éãç°¡åã«åãæ¿ããå¿ èŠãããå Žåã
- C#ãJavaãTypeScriptãªã©ã®ãžã§ããªã¯ã¹ããµããŒãããèšèªã䜿çšããŠããå Žåã
äžè¬çãªèœãšã穎ãšèæ ®äºé
- éå°ãªèšèšïŒãªãŒããŒãšã³ãžãã¢ãªã³ã°ïŒ: åçŽãªãªããžã§ã¯ãçæã§ååãªå Žåã¯ããã¡ã¯ããªãŒãã¿ãŒã³ã䜿çšããªãã§ãã ããããã¶ã€ã³ãã¿ãŒã³ã®äœ¿ãããã¯ãäžå¿ èŠãªè€éãã«ã€ãªããå¯èœæ§ããããŸãã
- ãã¡ã¯ããªãŒã®è€éã: ãªããžã§ã¯ãã®çš®é¡ã®æ°ãå¢ããã«ã€ããŠããã¡ã¯ããªãŒã®å®è£ ã¯è€éã«ãªãå¯èœæ§ããããŸããè€éãã管çããããã«ãæœè±¡ãã¡ã¯ããªãŒãã¿ãŒã³ãªã©ã®ããé«åºŠãªãã¡ã¯ããªãŒãã¿ãŒã³ã®äœ¿çšãæ€èšããŠãã ããã
- ãªãã¬ã¯ã·ã§ã³ã®ãªãŒããŒããã (Java): Javaã§ãªãã¬ã¯ã·ã§ã³ã䜿çšããŠãªããžã§ã¯ããäœæãããšãããã©ãŒãã³ã¹ã®ãªãŒããŒããããçºçããå¯èœæ§ããããŸããããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãäœæãããã€ã³ã¹ã¿ã³ã¹ããã£ãã·ã¥ããããç°ãªããªããžã§ã¯ãçæã¡ã«ããºã ã䜿çšããããšãæ€èšããŠãã ããã
- æ§æ: äœæãããªããžã§ã¯ãã®åã®æ§æãå€éšåããããšãæ€èšããŠãã ãããããã«ãããã³ãŒãã倿Žããããšãªããªããžã§ã¯ãçæããžãã¯ã倿Žã§ããŸããããšãã°ãããããã£ãã¡ã€ã«ããã¯ã©ã¹åãèªã¿åãããšãã§ããŸãã
- ãšã©ãŒåŠç: ãªããžã§ã¯ãçæã倱æããå Žåã«é©åã«åŠçããããã«ããã¡ã¯ããªãŒå ã§é©åãªãšã©ãŒåŠçã確å®ã«ããŠãã ããããããã°ã«åœ¹ç«ã€æ å ±æäŸæ§ã®é«ããšã©ãŒã¡ãã»ãŒãžãæäŸããŸãã
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã«ä»£ããéžæè¢
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã¯åŒ·åãªããŒã«ã§ãããç¹å®ã®ç¶æ³ã§ã¯ããé©ããŠããå¯èœæ§ã®ãããªããžã§ã¯ãçæãžã®ä»£æ¿ã¢ãããŒãããããŸãã
- äŸåæ§æ³šå ¥ (DI): DIãã¬ãŒã ã¯ãŒã¯ã¯ãªããžã§ã¯ãã®çæãšäŸåé¢ä¿ã管çã§ããæç€ºçãªãã¡ã¯ããªãŒã®å¿ èŠæ§ãæžãããŸããDIã¯ãå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«åœ¹ç«ã¡ãŸããSpring (Java)ã.NET DIã³ã³ãã (C#)ãAngular (TypeScript) ãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã¯ãå ç¢ãªDIæ©èœãæäŸããŸãã
- æœè±¡ãã¡ã¯ããªãŒãã¿ãŒã³: æœè±¡ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ãé¢é£ãããªããžã§ã¯ãã®ãã¡ããªãŒãå ·è±¡ã¯ã©ã¹ãæå®ããã«äœæããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸããããã¯ãäžè²«æ§ã®ãã補åãã¡ããªãŒã®äžéšã§ããè€æ°ã®é¢é£ãªããžã§ã¯ããäœæããå¿ èŠãããå Žåã«åœ¹ç«ã¡ãŸãã
- ãã«ããŒãã¿ãŒã³: ãã«ããŒãã¿ãŒã³ã¯ãè€éãªãªããžã§ã¯ãã®æ§ç¯ãšãã®è¡šçŸãåé¢ããåãæ§ç¯ããã»ã¹ã䜿çšããŠåããªããžã§ã¯ãã®ç°ãªã衚çŸãäœæã§ããããã«ããŸãã
- ãããã¿ã€ããã¿ãŒã³: ãããã¿ã€ããã¿ãŒã³ã¯ãæ¢åã®ãªããžã§ã¯ãïŒãããã¿ã€ãïŒãã³ããŒããŠæ°ãããªããžã§ã¯ããäœæããããšãå¯èœã«ããŸããããã¯ãæ°ãããªããžã§ã¯ãã®äœæãé«äŸ¡ãŸãã¯è€éãªå Žåã«åœ¹ç«ã¡ãŸãã
å®äžçã®äŸ
- ããŒã¿ããŒã¹æ¥ç¶ãã¡ã¯ããªãŒ: æ§æèšå®ã«åºã¥ããŠç°ãªãçš®é¡ã®ããŒã¿ããŒã¹æ¥ç¶ïŒäŸïŒMySQLãPostgreSQLãOracleïŒãäœæããã
- 決æžã²ãŒããŠã§ã€ãã¡ã¯ããªãŒ: éžæãããæ±ºæžæ¹æ³ã«åºã¥ããŠç°ãªã決æžã²ãŒããŠã§ã€å®è£ ïŒäŸïŒPayPalãStripeãVisaïŒãäœæããã
- UIèŠçŽ ãã¡ã¯ããªãŒ: ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®ããŒããŸãã¯ãã©ãããã©ãŒã ã«åºã¥ããŠç°ãªãUIèŠçŽ ïŒäŸïŒãã¿ã³ãããã¹ããã£ãŒã«ããã©ãã«ïŒãäœæããã
- ã¬ããŒãçæãã¡ã¯ããªãŒ: éžæããã圢åŒã«åºã¥ããŠç°ãªãçš®é¡ã®ã¬ããŒãïŒäŸïŒPDFãExcelãCSVïŒãçæããã
ãããã®äŸã¯ãããŒã¿ã¢ã¯ã»ã¹ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹éçºã«è³ããŸã§ãããŸããŸãªãã¡ã€ã³ã«ããããžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã®å€æ§æ§ã瀺ããŠããŸãã
çµè«
ãžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ããœãããŠã§ã¢éçºã«ãããŠåå®å šãªãªããžã§ã¯ãçæãå®çŸããããã®è²ŽéãªããŒã«ã§ãããžã§ããªã¯ã¹ã掻çšããããšã§ããã¡ã¯ããªãŒã«ãã£ãŠäœæããããªããžã§ã¯ããæåŸ ãããåã«é©åããããšãä¿èšŒããå®è¡æãšã©ãŒã®ãªã¹ã¯ã軜æžããã³ãŒãã®ä¿å®æ§ãåäžãããŸããæœåšçãªæ¬ ç¹ãä»£æ¿æ¡ãèæ ®ããããšãäžå¯æ¬ ã§ããããžã§ããªãã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ãç¹ã«ãžã§ããªã¯ã¹ããµããŒãããèšèªã䜿çšããå Žåã«ãã¢ããªã±ãŒã·ã§ã³ã®èšèšãšå ç¢æ§ãå€§å¹ ã«åäžãããããšãã§ããŸãããã¶ã€ã³ãã¿ãŒã³ã®å©ç¹ãšãã³ãŒãããŒã¹ã®ã·ã³ãã«ãããã³ä¿å®æ§ã®å¿ èŠæ§ãšã®ãã©ã³ã¹ãåžžã«å¿ããªãã§ãã ããã